#include <iostream>


/**
 *  动态多态满足条件
        1、有继承关系
        2、子类重写父类的虚函数
    动态多态使用
        父类的指针或者引用 执行子类对象
 */
class Animal1 {
public:
    // 虚函数
     virtual void speak() {
        std::cout << "动物在说话" << std::endl;
    }
};

class Cat : public Animal1 {
public:
    void speak() override {
        std::cout << "小猫在说话" << std::endl;
    }
};

class Dog : public Animal1 {
public:
    void speak() {
        std::cout << "狗在说话" << std::endl;
    }
};

// 地址早绑定，在编译阶段确定函数地址
// 需要让函数动态绑定，函数添加virtual
void doSpeak(Animal1 &animal) {
    animal.speak();
}

void test() {
    Cat cat;
    doSpeak(cat);
    Dog dog;
    doSpeak(dog);
}

int main() {

    test();
    return 0;
}

